1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| #include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; const int N = 2e5 + 5; int hd[N], to[N * 2], nxt[N * 2], num = 1; void add(int u, int v) { num++; to[num] = v; nxt[num] = hd[u]; hd[u] = num; } int t, n, m, k, l; int s[N], d[N]; int dis[N], fs[N]; bool vis[N], ok[N]; bool is[N]; void dfs(int x) { if (ok[x]) return; ok[x] = 1; if (x == 1) return; for (int i = hd[x]; i; i = nxt[i]) { int v = to[i]; if (dis[v] == dis[x] - 1 && fs[v] + is[x] == fs[x]) dfs(v); } } int main() { cin >> t; while (t--) { cin >> n >> m >> k >> l; memset(is, 0, sizeof(is)); for (int i = 1; i <= k; i++) { cin >> s[i]; is[s[i]] = 1; } for (int i = 1; i <= l; i++) { cin >> d[i]; } memset(hd, 0, sizeof(hd)); num = 1; for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; add(u, v); add(v, u); } memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); memset(fs, 0, sizeof(fs)); dis[1] = 0; queue<int> q; q.push(1); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = hd[u]; i; i = nxt[i]) { int v = to[i]; if (dis[u] + 1 < dis[v]) { dis[v] = dis[u] + 1; fs[v] = fs[u] + is[v]; q.push(v); vis[v] = 1; } else if (dis[u] + 1 == dis[v]) { fs[v] = max(fs[v], fs[u] + is[v]); } } } memset(ok, 0, sizeof(ok)); for (int i = 1; i <= l; i++) { if (fs[d[i]] == k) dfs(d[i]); } for (int i = 2; i <= n; i++) { if (ok[i]) cout << 1; else cout << 0; } cout << endl; } return 0; }
|